package com.atguigu.lease.web.admin.custom.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

/**
 * Description:
 *
 * @author Yanxinhao on 2024/11/16
 */
@Component
public class StringToBaseEnumConverterFactory implements ConverterFactory<String, BaseEnum> {

    /**
     * 转换器工厂
     * @param targetType TODO 我们想要将String类转换成对应的枚举类的类型的Class对象，这里用泛型
     * @return TODO 我们要根据这个工厂类，来返回一个转换器，这个转换器就是将String类转换成对应的枚举类
     * @param <T>
     */
    @Override
    //TODO <T extends BaseEnum> 的含义是什么？
    // T extends BaseEnum 表示目标类型必须是BaseEnum的子类，也就是目标类型必须继承或者实现BaseEnum接口。
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        //返回一个转换器
        return new Converter<String, T>() {
            @Override
            public T convert(String source) {
                //1.我们手里有一个枚举类的Class对象，我们可以根据这个Class对象
                //1.通过反射技术，获取这个枚举类中的所有枚举项
                T[] enumConstants = targetType.getEnumConstants();
                //2.遍历枚举项数组，来判断其中的枚举项的Code属性值是否有与source匹配的
                for (T enumConstant : enumConstants) {
                    if (enumConstant.getCode().equals(Integer.valueOf(source))){
                        return enumConstant;
                    }
                }
                //3.如果没有匹配上的，就抛出非法参数异常
                throw new IllegalArgumentException("code非法");
            }
        };
    }
}